package com.ng.controller;

import com.ng.entity.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * ProjectName: springMvc01->BookController
 * Description: TODO：
 * Author: 丘丘
 * DateTime: 2024/12/26 14:40
 */
@Controller
public class BookController {



    // CRUD
    @RequestMapping("/getString")  //http://localhost:8080/getString
    public String t1() {
        return "index.jsp";  // 默认情况下，如果直接返回字符串，是指这个字符串对应的视图页面
    }


    @RequestMapping("/getStr")  //http://localhost:8080/getString
    @ResponseBody  // 这个注解告诉系统，我响应的就是数据本身，而不是视图
    public String t2() {
        return "6666";  // 如何就真的只返回666本身，而不是一个页面。加一个注解
    }


    // 如何响应一个对象 text/html;charset=utf-8 只能请求响应的乱码
    @RequestMapping(value = "getBook")
    @ResponseBody
    public Book getBook() {
        Book book = new Book(1, "一路向西", "三毛", "闽西");
        return book; // 如果想直接返回一个对象类型的数据 ，需要使用 json，jackson会自动将对象。转json，
    }


    @RequestMapping(value = "getBookList")
    @ResponseBody
    public List<Book> getBookList() {
        Book book = new Book(1, "一路向西1", "三毛", "闽西");
        Book book1 = new Book(2, "一路向西2", "三毛", "闽西");
        Book book2 = new Book(3, "一路向西3", "三毛", "闽西");
        Book book3 = new Book(4, "一路向西4", "三毛", "闽西");
        Book book4 = new Book(5, "一路向西5", "三毛", "闽西");
        List<Book> bookList = new ArrayList<Book>();
        bookList.add(book);
        bookList.add(book1);
        bookList.add(book2);
        bookList.add(book3);
        bookList.add(book4);

        return bookList;

    }


//     方法的返回值 ，是响应的数据 ，而方法的形参就是请求的参数,要求，请求参数与形参名称一致
    @RequestMapping(value = "t1",produces = "application/json;charset=utf-8")
    @ResponseBody
    public String testGet1(@RequestParam(value = "user",required = false,defaultValue = "老六") String username, int age){  //user=libai&age=18
        System.out.println(username+"今年"+age+"岁了");
        return username+"今年"+age+"岁了";
    }

// 如何直接从请求得到一个对象 bookId,bookName,bookAuthor,bookPublisher
    @RequestMapping("/getBook1")
    @ResponseBody
    public Book getBook2(Book book){  // 用对象做形参时，只要请求参数名称，与对象的属性名一致即可。
        System.out.println("book = " + book);
        return book;
    }



    // 假设一个表单要提交用户的爱好hobby：唱歌，跳舞 ，游戏,就要求java系统 要接收一个数组，或集合
    @RequestMapping("/getArray")  // /getArray?hobby=唱歌&hobby=跳舞&hobby=游戏
    @ResponseBody
    public String[] getArray(String[] hobby){  // 用对象做形参时，只要请求参数名称，与对象的属性名一致即可。
        System.out.println("Arrays.asList(hobby) = " + Arrays.asList(hobby));
        return hobby;
    }

    // 如果对象数组呢？Book[]
    @RequestMapping("/getList")  // getList?list=111&list=222
    @ResponseBody
    public List<String> getList(@RequestParam  List<String> list){
        return list;
    }

    // 如果对象集合呢？List<Book> ，json格式来传递，js,ajax,axios


    @RequestMapping("/getListJson")  // getListJson ,通过js直接将整个js集合发送
    @ResponseBody
    public List<Book> getListJson(@RequestBody List<Book> list){ //@RequestBody 表示用json发送
        return list;
    }



}
